import type { RouteLocationNormalized, Router } from 'vue-router';

import { useRouter } from 'vue-router';
import { unref } from 'vue';

import { useMultipleTabStore } from '@/store/modules/multipleTab';
import { useAppStore } from '@/store/modules/app';

enum TableActionEnum {
	REFRESH,
	CLOSE_ALL,
	CLOSE_LEFT,
	CLOSE_RIGHT,
	CLOSE_OTHER,
	CLOSE_CURRENT,
	CLOSE,
}

export function useTabs(_router?: Router) {
	const appStore = useAppStore();

	function canIUseTabs(): boolean {
		const { show } = appStore.getMultiTabsSetting;
		if (!show) {
			throw new Error('The multi-tab page is currently not open, please open it in the settings！');
		}
		return !!show;
	}

	const tabStore = useMultipleTabStore();
	const router = _router || useRouter();

	const { currentRoute } = router;

	function getCurrentTab() {
		const route = unref(currentRoute);
		return tabStore.getTabList.find(item => item.path === route.path)!;
	}

	async function updateTabTitle(title: string, tab?: RouteLocationNormalized) {
		const canIUse = canIUseTabs;
		if (!canIUse) {
			return;
		}
		const targetTab = tab || getCurrentTab();
		await tabStore.setTabTitle(title, targetTab);
	}

	async function updateTabPath(path: string, tab?: RouteLocationNormalized) {
		const canIUse = canIUseTabs;
		if (!canIUse) {
			return;
		}
		const targetTab = tab || getCurrentTab();
		await tabStore.updateTabPath(path, targetTab);
	}

	async function handleTabAction(action: TableActionEnum, tab?: RouteLocationNormalized) {
		const canIUse = canIUseTabs;
		if (!canIUse) {
			return;
		}
		const currentTab = getCurrentTab();
		switch (action) {
			case TableActionEnum.REFRESH:
				await tabStore.refreshPage(router);
				break;

			case TableActionEnum.CLOSE_ALL:
				await tabStore.closeAllTab(router);
				break;

			case TableActionEnum.CLOSE_LEFT:
				await tabStore.closeLeftTabs(currentTab, router);
				break;

			case TableActionEnum.CLOSE_RIGHT:
				await tabStore.closeRightTabs(currentTab, router);
				break;

			case TableActionEnum.CLOSE_OTHER:
				await tabStore.closeOtherTabs(currentTab, router);
				break;

			case TableActionEnum.CLOSE_CURRENT:
			case TableActionEnum.CLOSE:
				await tabStore.closeTab(tab || currentTab, router);
				break;
		}
	}

	return {
		refreshPage: () => handleTabAction(TableActionEnum.REFRESH),
		closeAll: () => handleTabAction(TableActionEnum.CLOSE_ALL),
		closeLeft: () => handleTabAction(TableActionEnum.CLOSE_LEFT),
		closeRight: () => handleTabAction(TableActionEnum.CLOSE_RIGHT),
		closeOther: () => handleTabAction(TableActionEnum.CLOSE_OTHER),
		closeCurrent: () => handleTabAction(TableActionEnum.CLOSE_CURRENT),
		close: (tab?: RouteLocationNormalized) => handleTabAction(TableActionEnum.CLOSE, tab),
		setTitle: (title: string, tab?: RouteLocationNormalized) => updateTabTitle(title, tab),
		updatePath: (fullPath: string, tab?: RouteLocationNormalized) => updateTabPath(fullPath, tab),
	};
}
